package com.estore.view;

import com.estore.model.Product;
import com.estore.service.ProductService;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.io.*;
/**
 * 控制台界面：仅负责用户交互，所有业务逻辑调用ProductService
 */
public class ConsoleShop {
    private final ProductService productService = new ProductService(); // 业务层实例
    private final Map<String, Integer> shoppingCart = new HashMap<>(); // 购物车：ID→数量
    private final Scanner scanner = new Scanner(System.in);

    // 程序入口
    public static void main(String[] args) {
        new ConsoleShop().start();
    }

    // 启动程序：循环显示菜单
    public void start() {
        while (true) {
            showMainMenu();
            int choice = getValidChoice(1, 99); // 只接受1-4的输入

            switch (choice) {
                case 1:
                    browseProducts(); // 浏览商品（带排序）
                    break;
                case 2:
                    addToCart(); // 添加商品到购物车
                    break;
                case 3:
                    viewCart(); // 查看购物车
                    break;
                case 4:
                    productService.saveData();
                    System.out.println("感谢使用，再见！");
                    scanner.close();
                    return;
                //隐藏功能：管理员手动备份（不会在菜单中显示）
                case 99:
                    backupDataManually();
                    break;
                default:
                    System.out.println("输入无效，请重新输入！");
            }
        }
    }

    // 显示主菜单
    private void showMainMenu() {
        System.out.println("\n===== 控制台商城 =====");
        System.out.println("1. 浏览商品（支持排序）");
        System.out.println("2. 添加商品到购物车");
        System.out.println("3. 查看购物车");
        System.out.println("4. 退出");
        System.out.print("请输入选项（1-4）：");
    }

    // 浏览商品：选择排序方式并显示
    private void browseProducts() {
        System.out.println("\n--- 选择排序方式 ---");
        System.out.println("1. 按商品ID升序（默认）");
        System.out.println("2. 按价格从低到高");
        System.out.println("3. 按价格从高到低");
        System.out.println("4. 按库存从多到少");
        System.out.print("请输入排序选项（1-4）：");
        int sortType = getValidChoice(1, 4);
        List<Product> sortedProducts = productService.getSortedProducts(sortType);

        // 显示排序后的商品
        System.out.println("\n--- 商品列表 ---");
        if (sortedProducts.isEmpty()) {
            System.out.println("当前无商品");
        } else {
            sortedProducts.forEach(System.out::println);
        }
    }

    // 添加商品到购物车
    private void addToCart() {
        System.out.print("\n请输入要添加的商品ID：");
        String productId = scanner.nextLine().trim();

        // 1. 验证商品是否存在
        Product product = productService.getProductById(productId);
        if (product == null) {
            System.out.println("错误：该商品ID不存在！");
            return;
        }
        // 2. 验证商品是否有库存
        if (product.getStock() <= 0) {
            System.out.println("抱歉：" + product.getName() + "已售罄！");
            return;
        }
        // 3. 输入并验证购买数量
        System.out.print("请输入购买数量：");
        int quantity = getValidQuantity(product.getStock());
        // 4. 添加到购物车（已存在则累加数量）
        shoppingCart.put(productId, shoppingCart.getOrDefault(productId, 0) + quantity);
        System.out.println("成功添加：" + product.getName() + " × " + quantity);
    }

    // 查看购物车
    private void viewCart() {
        System.out.println("\n--- 我的购物车 ---");
        if (shoppingCart.isEmpty()) {
            System.out.println("购物车为空，快去添加商品吧！");
            return;
        }

        double totalAmount = 0.0;
        // 遍历购物车并计算总价
        for (Map.Entry<String, Integer> entry : shoppingCart.entrySet()) {
            String productId = entry.getKey();
            int quantity = entry.getValue();
            Product product = productService.getProductById(productId);

            double subtotal = product.getPrice() * quantity;
            totalAmount += subtotal;
            // 格式化输出购物车项
            System.out.printf("商品：%-20s | 单价：¥%.2f | 数量：%d | 小计：¥%.2f\n",
                    product.getName(), product.getPrice(), quantity, subtotal);
        }

        System.out.println("---------------------------");
        System.out.printf("购物车总计：¥%.2f\n", totalAmount);
    }
    private void backupDataManually() {
        String sourceFile = "data/products.dat";
        String backupFile = "data/products.dat.bak";

        File dir = new File("data");
        if (!dir.exists()) {
            System.err.println("❌ 数据目录不存在！");
            return;
        }

        try (FileInputStream fis = new FileInputStream(sourceFile);
             FileOutputStream fos = new FileOutputStream(backupFile)) {

            byte[] buffer = new byte[1024]; // 缓冲区大小为 1KB
            int bytesRead;

            while ((bytesRead = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead); // 写入已读取的数据
            }

            System.out.println("✅ 手动备份成功！源文件：" + sourceFile + " → 备份文件：" + backupFile);

        } catch (FileNotFoundException e) {
            System.err.println("❌ 源文件未找到，请先保存一次数据！");
        } catch (IOException e) {
            System.err.println("❌ 手动备份失败：" + e.getMessage());
            e.printStackTrace();
        }
    }
    // 工具方法：获取1-4的有效选项（避免输入非数字）
    private int getValidChoice(int min, int max) {
        while (true) {
            if (scanner.hasNextInt()) {
                int choice = scanner.nextInt();
                scanner.nextLine(); // 消费换行符
                if (choice >= min && choice <= max) {
                    return choice;
                } else {
                    System.out.print("输入无效，请输入" + min + "-" + max + "的数字：");
                }
            } else {
                scanner.next(); // 清除非数字输入
                System.out.print("输入无效，请输入数字：");
            }
        }
    }

    // 工具方法：获取有效的购买数量（1-库存上限）
    private int getValidQuantity(int maxStock) {
        while (true) {
            if (scanner.hasNextInt()) {
                int quantity = scanner.nextInt();
                scanner.nextLine(); // 消费换行符
                if (quantity > 0 && quantity <= maxStock) {
                    return quantity;
                } else if (quantity <= 0) {
                    System.out.print("数量无效，请输入正数：");
                } else {
                    System.out.print("库存不足，最大可购买" + maxStock + "件，请重新输入：");
                }
            } else {
                scanner.next(); // 清除非数字输入
                System.out.print("输入无效，请输入数字：");
            }
        }
    }
}
